﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
''' <summary>
''' Malt den Einsatz Bildschirm fuer die Gabe. Hinweis Doppel-Gabe Balken fehlt noch.
''' </summary>
''' <remarks></remarks>
Public Class AnimationGabeEinsatz
    Inherits ObjektAnimation
    Dim Hintergrundstextur As Texture
    Dim Frame2 As Integer = 0
    Dim Frame2Max As Integer = 0
    Dim Gabetext As Char() = {}
    Dim XPos As Integer
    Dim DoppelgabeSynergie As Integer
    Public Sub New(ByVal Musikspielen As Boolean)
        MyBase.New(Musikspielen, ObjektSpielfeld.TopLayer)
        If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Gabe Then
            Hintergrundstextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "GabeEinsatz\Gabe.png"), Hauptmenue.Farbtabelleerstellen(Objektverwalter.Spielfeld.AktuellerSpieler.Farbe))
        Else
            Hintergrundstextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "GabeEinsatz\Spezialgabe.png"), Hauptmenue.Farbtabelleerstellen(Objektverwalter.Spielfeld.AktuellerSpieler.Farbe))
        End If
        'Wir laden den Gabetext.
        Select Case Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus
            Case ObjektKO.Gabemodi.Gabe
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gaben IsNot Nothing Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gaben.Length >= 1 Then
                        Gabetext = Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gaben(0).ToCharArray
                    Else
                        Gabetext = Sprachconverter.Translate("Gabe").ToCharArray
                    End If
                Else
                    Gabetext = Sprachconverter.Translate("Gabe").ToCharArray
                End If
            Case ObjektKO.Gabemodi.Spezialgabe
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gaben IsNot Nothing Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gaben.Length >= 2 Then
                        Gabetext = Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gaben(1).ToCharArray
                    Else
                        Gabetext = Sprachconverter.Translate("Spezialgabe").ToCharArray
                    End If
                Else
                    Gabetext = Sprachconverter.Translate("Spezialgabe").ToCharArray
                End If
            Case ObjektKO.Gabemodi.Doppelgabe
                Gabetext = ObjektKOBeschreibung.GetDoppelgabeName(Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild), Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(1).Bild)).ToCharArray
                DoppelgabeSynergie = 100 + CInt(ObjektKOBeschreibung.GetSynergie(Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild), Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(1).Bild)) * CDec(10))
        End Select
        'Berechnung der Dauer der Animation
        Frame2Max += 10 'Screenflash
        Frame2Max += 10 'Zeit waehrend der die KO's erscheinen.
        Frame2Max += Gabetext.Length * 5 'Zeit zum Malen der Gabeart.
        Frame2Max += 15 'Zeit waehrend der der Text da steht.
        Frame2Max += 10 'Zeit zum Malen der Balken.
        Frame2Max += 10  'Screenflash Back
        'Wir fuegen die Handler hinzu
    End Sub
    Public Overrides Function Malen(ByVal intColor As System.Drawing.Color, Optional ByVal Zoomfaktor As Single = 1.0, Optional ByVal Feldbreite As Integer = -1) As Boolean

        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        If M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts Then
            If DataSettings._2D_3D_Malen Or DataSettings.draw3D Then
                Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
            End If

            Dim sngrotation As Single = 0
            XPos += 10
            If XPos > DataSettings.BildschirmBreite Then XPos -= DataSettings.BildschirmBreite


            'Die KO's haben geredet jetzt sind wir dran
            If Frame2 < 10 Then
                Grafikengine.fillRect(New Rectangle(0, 0, DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe), Color.FromArgb(200 - (20 - Frame2) * 10, 255, 255, 255))
            Else
                Grafikengine.ptfPosition = New Point(XPos - DataSettings.BildschirmBreite, 0)
                Grafikengine.ptfRotCenter = New Point
                Grafikengine.recBild = Nothing
                Grafikengine.szfScale = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
                Grafikengine.Sprite.Draw2D(Hintergrundstextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition = New Point(XPos, 0)
                Grafikengine.Sprite.Draw2D(Hintergrundstextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intColor)
            End If


            Dim Groesse As Integer = 2
            'Wir malen die Buchstaben
            If Frame2 > 30 And Frame2 < Frame2Max - 10 - 3 * Gabetext.Length - 15 Then
                Dim BuchstabenZahl As Integer = Math.DivRem(Frame2 - 30, 3, 0)
                If BuchstabenZahl > Gabetext.Length Then BuchstabenZahl = Gabetext.Length
                Dim P As New Point(DataSettings.BildschirmBreite / 2 - Gabetext.Length * 2 * ObjektAlphabet.BuchstabenBreite / 2, DataSettings.BildschirmHoehe / 2 - ObjektAlphabet.BuchstabenHoehe * Groesse / 2)
                For I = 0 To BuchstabenZahl - 1
                    ObjektAlphabet.DrawBuchstabe(Gabetext(I), 1, P, 2)
                    P.X += Groesse * ObjektAlphabet.BuchstabenBreite
                Next
            ElseIf Frame2 >= Frame2Max - 10 - 3 * Gabetext.Length - 15 Then
                Dim BuchstabenZahl As Integer = Math.DivRem(Frame2 - (Frame2Max - 10 - 3 * Gabetext.Length - 15), 3, 0)
                If BuchstabenZahl > Gabetext.Length Then BuchstabenZahl = Gabetext.Length
                Dim P As New Point(DataSettings.BildschirmBreite / 2 - Gabetext.Length * Groesse * ObjektAlphabet.BuchstabenBreite / 2 + BuchstabenZahl * Groesse * ObjektAlphabet.BuchstabenBreite, DataSettings.BildschirmHoehe / 2 - ObjektAlphabet.BuchstabenHoehe * Groesse / 2)
                For I = BuchstabenZahl To Gabetext.Length - 1
                    ObjektAlphabet.DrawBuchstabe(Gabetext(I), 1, P, 2)
                    P.X += Groesse * ObjektAlphabet.BuchstabenBreite
                Next
            End If
            'Wir malen die beiden Rechtecke oben und unten die den Text eingrenzen
            If Frame2 > 30 And Frame2 < Frame2Max - 10 - 3 * Gabetext.Length - 15 Then
                Dim Y As Integer = DataSettings.BildschirmHoehe / 2 - ObjektAlphabet.BuchstabenHoehe * Groesse / 2 - 4
                Dim X As Integer = DataSettings.BildschirmBreite * (Frame2 / (Frame2Max - 10 - 3 * Gabetext.Length))
                Grafikengine.fillRect(New Rectangle(0, Y, X, 4), Color.FromArgb(255, 48, 96, 144))
                Y += ObjektAlphabet.BuchstabenHoehe * Groesse + 4
                Grafikengine.fillRect(New Rectangle(DataSettings.BildschirmBreite - X, Y, X, 4), Color.FromArgb(255, 48, 96, 144))
            ElseIf Frame2 >= Frame2Max - 10 - 3 * Gabetext.Length - 15 Then
                Dim Y As Integer = DataSettings.BildschirmHoehe / 2 - ObjektAlphabet.BuchstabenHoehe * Groesse / 2 + ObjektAlphabet.BuchstabenHoehe * Groesse
                Dim T As Single = ((Frame2 - (Frame2Max - 10 - 3 * Gabetext.Length - 15)) / (Frame2Max - 10)) * 2
                Dim X As Integer = DataSettings.BildschirmBreite - DataSettings.BildschirmBreite * T
                Grafikengine.fillRect(New Rectangle(0, Y, X, 4), Color.FromArgb(255, 48, 96, 144))
                Y -= (ObjektAlphabet.BuchstabenHoehe * Groesse + 4)
                Grafikengine.fillRect(New Rectangle(DataSettings.BildschirmBreite - X, Y, X, 4), Color.FromArgb(255, 48, 96, 144))
            End If

            'Wir malen die KO's rein.
            If Frame2 > 10 And Frame2 < 40 Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild).KOMalen _
                    (40, DataSettings.BildschirmHoehe / 2 - 350 / 2 - (40 - Frame2) / 30 * DataSettings.BildschirmHoehe / 2)
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(1).Bild).KOMalen _
                   (DataSettings.BildschirmBreite - 211 - 40, DataSettings.BildschirmHoehe / 2 - 350 / 2 + (40 - Frame2) / 30 * DataSettings.BildschirmHoehe / 2)
                Else
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild).KOMalen _
                   (DataSettings.BildschirmBreite - 211 - 40, DataSettings.BildschirmHoehe / 2 - 350 / 2 + (40 - Frame2) / 30 * DataSettings.BildschirmHoehe / 2)
                End If
            ElseIf Frame2 >= 40 And Frame2 < Frame2Max - 30 Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild).KOMalen _
                    (40, DataSettings.BildschirmHoehe / 2 - 350 / 2)
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(1).Bild).KOMalen _
                    (DataSettings.BildschirmBreite - 211 - 40, DataSettings.BildschirmHoehe / 2 - 350 / 2)
                Else
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild).KOMalen _
                    (DataSettings.BildschirmBreite - 211 - 40, DataSettings.BildschirmHoehe / 2 - 350 / 2)
                End If
            ElseIf Frame2 >= Frame2Max - 30 Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild).KOMalen _
                    (40, DataSettings.BildschirmHoehe / 2 - 350 / 2 + (Frame2 - (Frame2Max - 30)) / 30 * DataSettings.BildschirmHoehe / 2)
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(1).Bild).KOMalen _
                    (DataSettings.BildschirmBreite - 211 - 40, DataSettings.BildschirmHoehe / 2 - 350 / 2 - (Frame2 - (Frame2Max - 30)) / 30 * DataSettings.BildschirmHoehe / 2)
                Else
                    Objektverwalter.GetKO(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Bild).KOMalen _
                   (DataSettings.BildschirmBreite - 211 - 40, DataSettings.BildschirmHoehe / 2 - 350 / 2 - (Frame2 - (Frame2Max - 30)) / 30 * DataSettings.BildschirmHoehe / 2)
                End If
            End If
            'Wir malen den Balken fuer die prozentuale Anzeige bei einer Doppelgabe.
            If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                Grafikengine.ptfRotCenter = New Point
                Grafikengine.recBild = Nothing
                Grafikengine.szfScale = Nothing
                Grafikengine.ptfPosition = New Point(DataSettings.BildschirmBreite / 2 - 127, DataSettings.BildschirmHoehe * (3 / 4))
                'Der Hintergrund des Balkens
                If Frame2 > 10 Then
                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(False), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 127
                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(False), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intColor)
                End If
                Grafikengine.ptfPosition = New Point(DataSettings.BildschirmBreite / 2 - 127, DataSettings.BildschirmHoehe * (3 / 4))
                'Der Fuellgrad des Balkens
                If Frame2 > 20 And Frame2 < 50 Then
                    '130 ist Maximale Synergie im Momement
                    Dim Fuellgrad As Integer = (DoppelgabeSynergie / 130) * (Frame2 - 20) / 30 * 254
                    Grafikengine.fillRect(DataSettings.BildschirmBreite / 2 - 127, DataSettings.BildschirmHoehe * (3 / 4), Fuellgrad, 9, Color.Aqua)
                    'Jetzt malen wir die Prozentuale Anzeigeschrift
                    Dim Zahl As String = CInt((DoppelgabeSynergie * (Frame2 - 20) / 30)).ToString + "%"
                    Dim P As New Point(DataSettings.BildschirmBreite / 2 - Zahl.Length * ObjektAlphabet.BuchstabenBreite / 2, DataSettings.BildschirmHoehe * (3 / 4) - 2 - ObjektAlphabet.BuchstabenHoehe)
                    ObjektAlphabet.DrawString(Zahl, 1, P, 0)
                ElseIf Frame2 >= 50 Then
                    Dim Fuellgrad As Integer = (DoppelgabeSynergie / 130) * 254
                    Grafikengine.fillRect(DataSettings.BildschirmBreite / 2 - 127, DataSettings.BildschirmHoehe * (3 / 4), Fuellgrad, 9, Color.Aqua)
                    'Jetzt malen wir die Prozentuale Anzeigeschrift
                    Dim Zahl As String = (DoppelgabeSynergie).ToString + "%"
                    Dim P As New Point(DataSettings.BildschirmBreite / 2 - Zahl.Length * ObjektAlphabet.BuchstabenBreite / 2, DataSettings.BildschirmHoehe * (3 / 4) - 2 - ObjektAlphabet.BuchstabenHoehe)
                    ObjektAlphabet.DrawString(Zahl, 1, P, 0)
                End If

                Grafikengine.ptfRotCenter = New Point
                Grafikengine.recBild = Nothing
                Grafikengine.szfScale = Nothing
                Grafikengine.ptfPosition = New Point(DataSettings.BildschirmBreite / 2 - 127, DataSettings.BildschirmHoehe * (3 / 4))
                'Der vordere Teil des Balkens
                If Frame2 > 10 Then
                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(True), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 127
                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(True), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intColor)
                End If
            End If
            If DataSettings._2D_3D_Malen Or DataSettings.draw3D Then
                Grafikengine.Sprite.End()
            End If
            If Frame2 > Frame2Max Then
                Select Case Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus
                    Case ObjektKO.Gabemodi.Gabe
                        Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabeeinsetzen()
                    Case ObjektKO.Gabemodi.Spezialgabe
                        Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).SpezialGabeeinsetzen()
                    Case ObjektKO.Gabemodi.Doppelgabe
                        Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).SpezialGabeeinsetzen()
                End Select

                Return False
            Else
                Frame2 += 1
                Return True
            End If
        Else
            Return True
        End If
    End Function
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case MouseButtons.Right
                Frame2 += Frame2Max
        End Select
    End Sub
    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case DataSettings.Bestaetigen
                Frame2 += Frame2Max
            Case DataSettings.Abrechen
                Frame2 += Frame2Max
        End Select
    End Sub
    Public Overrides Sub RemoveHandles()
        MyBase.RemoveHandles()
        Hintergrundstextur.Dispose()
        Hintergrundstextur = Nothing
        Grafikengine.Grafikkarte.EvictManagedResources()
    End Sub
End Class


